package com.mmq.ets.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.mmq.ets.modele.Carre;
import com.mmq.ets.modele.Cercle;
import com.mmq.ets.modele.AbstractForme;
import com.mmq.ets.modele.Ligne;
import com.mmq.ets.modele.Ovale;
/**
 * FabriqueForme gére la création des forme à partir d'une chaine caractère avec un format à 4 ou 3 arguments.
 */
public class FabriqueForme 
{
	/**
	 * @param formeString
	 * @return une forme soit un ligne, un carre, un rectangle, un cercle ou un ovale. Si la chaîne ne correpond pas au patrons definis
	 */
	public static AbstractForme creerForme(String formeString)
	{
		AbstractForme nouvelleFigure;
		Pattern patron = Pattern.compile(Labo2Const.PATRON_LIGNE_RECTANGLE_CARRE_OVALE);
		Matcher matcher = patron.matcher(formeString);
		if(!matcher.matches())// si le premier patron ne matchs pas, il passe au suivant 
		{
			patron = Pattern.compile(Labo2Const.PATRON_CERCLE);
			matcher = patron.matcher(formeString);
		}
		if(matcher.matches())
		{
			
			switch(matcher.group(Labo2Const.FORME_TYPE))
			{   
				case Labo2Const.TYPE_FORME_LIGNE:
				{
					nouvelleFigure=new Ligne
							(Integer.parseInt(matcher.group(Labo2Const.FORME_NSEQ)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG1)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG2)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG3)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG4)));
							return nouvelleFigure;
				}
				case Labo2Const.TYPE_FORME_CERCLE:
				{
					nouvelleFigure=new Cercle
							(Integer.parseInt(matcher.group(Labo2Const.FORME_NSEQ)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG1)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG2)),
							Integer.parseInt(matcher.group(Labo2Const.FORME_ARG3)));
							return nouvelleFigure;
				}
				case Labo2Const.TYPE_FORME_OVALE:
				{
					nouvelleFigure=new Ovale
						(Integer.parseInt(matcher.group(Labo2Const.FORME_NSEQ)),
						Integer.parseInt(matcher.group(Labo2Const.FORME_ARG1)),
						Integer.parseInt(matcher.group(Labo2Const.FORME_ARG2)),
						Integer.parseInt(matcher.group(Labo2Const.FORME_ARG3)),
						Integer.parseInt(matcher.group(Labo2Const.FORME_ARG4))); 
						return nouvelleFigure;
				}
				case Labo2Const.TYPE_FORME_CARRE:
				{
					nouvelleFigure=new Carre
					(Integer.parseInt(matcher.group(Labo2Const.FORME_NSEQ)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG1)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG2)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG3)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG4))
					);
					return nouvelleFigure;
				}
				case Labo2Const.TYPE_FORME_RECTANGLE:
				{
					nouvelleFigure=new com.mmq.ets.modele.Rectangle
					(Integer.parseInt(matcher.group(Labo2Const.FORME_NSEQ)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG1)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG2)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG3)),
					Integer.parseInt(matcher.group(Labo2Const.FORME_ARG4)));
					return nouvelleFigure;
				}
			}
		}	
		return null;
		
	}
}
